package top.jojoace.JPA.repository;


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import top.jojoace.JPA.model_DDL.BothWay_OneToMany.BW_StudentItem;
import top.jojoace.JPA.model_DDL.OneWay_OneToMany.OW_StudentItem;
import top.jojoace.JPA.model_DDL.SqlModel.SqlModel;

import javax.transaction.Transactional;
import java.util.List;

/**
 * public interface studentRepository extends JpaRepository<实体类,实体类主键类型>
 */
@Repository
public interface SqlRepository extends JpaRepository<SqlModel, Integer> {

    /**
     * 索引参数
     * ?X 为 参数,需要与方法定义的参数个数相一致，并且顺序也要一致.
     * <p>
     * 查询显示所有字段时需起别名
     * select 表别名 from 表名 as 表别名 where 别名.XXX = ?X
     */
    @Query("select sm from SqlModel as sm where sm.id = ?1 and sm.name = ?2")
    SqlModel findSqlModelByIdAndName(Long id, String name);


    /**
     * 命名参数(推荐使用此方式)
     * :XXXX 参数名，赋值时使用@Param("参数名"),而不用管顺序。
     */
    @Query("SELECT s FROM SqlModel s WHERE s.name = :name AND s.title = :title")
    List<SqlModel> findSqlModelsByNameAndTitle(@Param("name") String name, @Param("title") String title);

    @Query("SELECT s FROM SqlModel s WHERE s.name LIKE %?1%")// Like  索引参数
    List<SqlModel> findSqlModelsByName(String name);
    @Query("SELECT s FROM SqlModel s WHERE s.name LIKE %:name%")//Like  命名参数
    List<SqlModel> findSqlModelsByName2(@Param("name") String name);


    /**
     * 使用原生的SQL进行查询
     * 设置nativeQuery=true 即可以使用原生的SQL进行查询
     */
    @Query(value = "SELECT count(id) FROM SqlModel where id in not null", nativeQuery = true)
    long getTotalCount();


    /**
     * @Modifying注解
     * 　　　　1、在@Query注解中编写JPQL实现DELETE和UPDATE操作的时候必须加上@modifying注解
     *          以通知Spring Data 这是一个INSERT、DELETE、UPDATE、DDL操作。
     *
     * 　　　　2、UPDATE或者DELETE操作需要使用事务，此时需要 定义Service层，在Service层的方法上添加事务操作。
     *
     * 　　　　3、注意JPQL不支持INSERT操作、但JPARepository自带Save方法。
     */
    @Transactional
    @Modifying
    @Query("UPDATE SqlModel s SET s.title = :title WHERE s.id = :id")
    void updateSqlModelTitleById(@Param("id") Integer id, @Param("title") String title);

}
